package com.yan.qing.util;

import com.alibaba.excel.annotation.ExcelProperty;

import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;

/**
 * 获取类的字段和注解信息，目前可用于导出数据
 *
 * @author ws
 * @Date 14:02 2023/2/10
 **/
public class FieldAnnotationUtils {


    /**
     * 用于使用easyExcel导出简单表头数据使用。
     * 获取需要的字段和对应的注解属性值，没有的排除字段可传空数组不可为空，使用如下：
     * 1、不排除字段（即所有字段）或者排除字段，则所有字段fieldList参数为空，排除字段fieldList为需要排除的字段。 exclude为true
     * 2、包含字段 则fieldList为需要的字段。exclude为false
     *
     * @param clazz     需要获取字段注解的类的class
     * @param fieldList 需要排除的字段
     * @param exclude   是否为排除字段
     * @return 返回实体类的顺序字段map
     */
    public static LinkedHashMap<String, String> getDeclaredFieldsInfo(Class clazz, List<String> fieldList, boolean exclude) {
        if (Objects.isNull(fieldList) || Objects.isNull(clazz)) {
            throw new IllegalArgumentException("clazz or ExcludeList  can not be null");
        }
        Field[] fields = clazz.getDeclaredFields();
        LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
        for (Field field : fields) {
            if (exclude) {
                //过滤出不需要的字段
                if (!fieldList.contains(field.getName())) {
                    if (field.isAnnotationPresent(ExcelProperty.class)) {
                        ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                        linkedHashMap.put(field.getName(), annotation.value()[0]);
                    }
                }
            } else {
                //只获取fieldList包含的字段
                if (fieldList.contains(field.getName())) {
                    if (field.isAnnotationPresent(ExcelProperty.class)) {
                        ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                        linkedHashMap.put(field.getName(), annotation.value()[0]);
                    }
                }
            }
        }
        return linkedHashMap;
    }
}
